package main

import (
	"fmt"
	"log"
	"time"

	"gorm.io/driver/mysql" // 还需要 github.com/go-sql-driver/mysqkl? 需要，增强封装
	"gorm.io/gorm"
)

var db *gorm.DB // 重新封装了，为了增强功能, 后面操作都需要 db

func init() {
	var err error
	dsn := "root:123456@tcp(127.0.0.1:3306)/test?parseTime=true&loc=Local"
	mysqlDialector := mysql.Open(dsn)
	db, err = gorm.Open(mysqlDialector, &gorm.Config{
		// gorm.Open -> dialector.Initialize() -> sql.Open("mysql",dsn)
		// 导入了驱动包，驱动包的 init()执行了，注册了 mysql 这个名字和对应的驱动对象
		// 全局选项
		// Logger: logger.Default.LogMode(logger.Info),
	})
	if err != nil {
		log.Fatal(err, "!!!")
	}
	db = db.Debug()
	fmt.Println(db)
}

type Emp struct {
	// EmpNo int // 默认对应emp_no
	EmpNo     int `gorm:"primaryKey"`
	FirstName string
	LastName  string
	BirthDate string
	Hire_Date string
	Gender    byte
}

// GORM 提供了一组约定。表名约定，结构体的
func (Emp) TableName() string {
	return "employees"
}

type Student struct { // students
	Id       int        `gorm:"primaryKey"`
	Name     string     `gorm:"type:varchar(48);not null"` // text, longtext, varchar char
	Age      int        `gorm:"type:tinyint"`              // tinyint, shortint, bigint
	Birthday *time.Time // *time.Time
	Gender   int        `gorm:"size:8"` // uint8
}

func (s *Student) String() string {
	return fmt.Sprintf("<Stu id:%d, %s, %d>", s.Id, s.Name, s.Age)
}

func main() {
	// 根据条件直接改
	db.Model(&Student{Id: 101}).
		// Update("age", 33)
		// Updates(&Student{Name: "sam", Age: 50})
		Updates(map[string]any{"name": "sammy", "age": 45})
	fmt.Println(db.Error)
	fmt.Println(db.RowsAffected)

	// 先查后改
	var s Student
	fmt.Println(s)
	db.Take(&s, 103)
	fmt.Println(s)
	if s.Id > 0 {
		s.Name = "John"
		s.Age += 10
	}
	fmt.Println(s)
	db.Save(&s)
	fmt.Println(s)
}
